package br.com.tiespec.web.ManagedBean;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.tiespec.ejb.EjbInterface.UsuarioInterface;
import br.com.tiespec.model.Enum.TipoSortOrder;
import br.com.tiespec.model.Modelo.ClientePortal;
import br.com.tiespec.model.Modelo.Perfil;
import br.com.tiespec.model.Modelo.Usuario;
import br.com.tiespec.model.Util.RNException;
import br.com.tiespec.web.Util.InitUtil;
import br.com.tiespec.web.Util.MsgUtil;
import br.com.tiespec.web.Util.WebUtil;

@Named("usuarioBean")
@SessionScoped
public class UsuarioBean implements Serializable {

	private static final long serialVersionUID = -8781854931530562167L;

	@EJB private UsuarioInterface ejb;
	
	private ClientePortal clientePortalInstance;
	private LazyDataModel<ClientePortal> clientePortalList;
	private String varBuscaClientePortal;
	
	private Usuario[] usuarioSelecionados;
	private Usuario usuarioInstance;
	private Usuario usuarioInstanceTemp;
	private LazyDataModel<Usuario> usuarioList;
	private String varBuscaNome;
	private String varBuscaEmail;
	private String varBuscaCliente;
	
	private List<Perfil> perfilList;
	private Long idPerfil;
	
	public String usuario(){
		init();
		return "/views/usuario/show.xhtml";
	}
	
	@PostConstruct
	public void init(){
		usuarioInstance = new Usuario();
		usuarioInstanceTemp = new Usuario();
		clientePortalInstance = new ClientePortal();
		varBuscaNome = null;
		varBuscaEmail = null;
		varBuscaClientePortal = null;
		varBuscaCliente = null;
		clientePortalList = InitUtil.inicializaClientePortalList();
		usuarioList = InitUtil.inicializaUsuarioList();
		perfilList = ejb.listarPerfil();
		idPerfil = null;
	}
	
	public String goCreate(){
		usuarioInstance = new Usuario();
		return "/views/usuario/create.xhtml";
	}
	
	public String goEdit(){
		return "/views/usuario/edit.xhtml";
	}
	
	public String salvar(){
		try {
			ejb.salvarUsuario(usuarioInstance);
			MsgUtil.msgSucesso("sal", usuarioInstance.getNomeCompleto());
			return "/views/usuario/show.xhtml";
		} catch (RNException e) {
			MsgUtil.msgErro("sal", usuarioInstance.getNomeCompleto());
			e.printStackTrace();
			return null;
		}
	}
	
	public void delete(){
		try {
			ejb.removerUsuario(usuarioInstance);
			MsgUtil.msgSucesso("del", usuarioInstance.getNomeCompleto());
		} catch (RNException e) {
			MsgUtil.msgErro("del", usuarioInstance.getNomeCompleto());
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("serial")
	public void filtrarUsuario(){
			usuarioList = new LazyDataModel<Usuario>() {
	        @Override
	        public List<Usuario> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
	        	WebUtil.setDataTableRows(pageSize);
				return ejb.listarUsuario(first, pageSize, sortField, 
					TipoSortOrder.convertePrimeFaces(sortOrder.toString()), varBuscaNome, varBuscaEmail, varBuscaCliente);
	        }
	        @Override  
	        public Usuario getRowData(String rowKey) {  
	        	try {
	        		return ejb.selecionarUsuario(Long.parseLong(rowKey));
	        	} catch (NumberFormatException e){
	        		return new Usuario();
	        	}
	        }  
	        @Override  
	        public String getRowKey(Usuario objeto) {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
	    };
	    usuarioList.setRowCount(ejb.countUsuario(varBuscaNome, varBuscaEmail, varBuscaCliente));
	    usuarioList.setPageSize(5);
	}
	
	public void selecionarUsuario(){
		usuarioInstance = ejb.selecionarUsuarioComClienteEPerfil(usuarioInstanceTemp.getId());
	}
	
	public void cancelarSelecionarUsuario(){
		varBuscaNome = null;
		varBuscaEmail = null;
		varBuscaCliente = null;
		usuarioInstanceTemp = null;
		usuarioList = InitUtil.inicializaUsuarioList();
	}
	
	public String goHome(){
		this.destroy();
		return "goHome";
	}
	
	@PreDestroy
	public void destroy(){
		usuarioInstance = null;
		usuarioInstanceTemp = null;
		clientePortalInstance = null;
		varBuscaNome = null;
		varBuscaEmail = null;
		varBuscaClientePortal = null;
		varBuscaCliente = null;
		clientePortalList = null;
		usuarioList = null;
		perfilList = null;
		idPerfil = null;
	}

	public ClientePortal getClientePortalInstance() {
		return clientePortalInstance;
	}

	public void setClientePortalInstance(ClientePortal clientePortalInstance) {
		this.clientePortalInstance = clientePortalInstance;
	}

	public LazyDataModel<ClientePortal> getClientePortalList() {
		return clientePortalList;
	}

	public void setClientePortalList(LazyDataModel<ClientePortal> clientePortalList) {
		this.clientePortalList = clientePortalList;
	}

	public String getVarBuscaClientePortal() {
		return varBuscaClientePortal;
	}

	public void setVarBuscaClientePortal(String varBuscaClientePortal) {
		this.varBuscaClientePortal = varBuscaClientePortal;
	}

	public Usuario getUsuarioInstance() {
		return usuarioInstance;
	}

	public void setUsuarioInstance(Usuario usuarioInstance) {
		this.usuarioInstance = usuarioInstance;
	}

	public Usuario getUsuarioInstanceTemp() {
		return usuarioInstanceTemp;
	}

	public void setUsuarioInstanceTemp(Usuario usuarioInstanceTemp) {
		this.usuarioInstanceTemp = usuarioInstanceTemp;
	}

	public LazyDataModel<Usuario> getUsuarioList() {
		return usuarioList;
	}

	public void setUsuarioList(LazyDataModel<Usuario> usuarioList) {
		this.usuarioList = usuarioList;
	}

	public String getVarBuscaNome() {
		return varBuscaNome;
	}

	public void setVarBuscaNome(String varBuscaNome) {
		this.varBuscaNome = varBuscaNome;
	}

	public String getVarBuscaEmail() {
		return varBuscaEmail;
	}

	public void setVarBuscaEmail(String varBuscaEmail) {
		this.varBuscaEmail = varBuscaEmail;
	}

	public String getVarBuscaCliente() {
		return varBuscaCliente;
	}

	public void setVarBuscaCliente(String varBuscaCliente) {
		this.varBuscaCliente = varBuscaCliente;
	}
	
	public Long getIdPerfil() {
		return idPerfil;
	}
	
	public void setIdPerfil(Long idPerfil) {
		this.idPerfil = idPerfil;
	}
	
	public List<Perfil> getPerfilList() {
		return perfilList;
	}
	
	public void setPerfilList(List<Perfil> perfilList) {
		this.perfilList = perfilList;
	}
	
	public Usuario[] getUsuarioSelecionados() {
		return usuarioSelecionados;
	}
	
	public void setUsuarioSelecionados(Usuario[] usuarioSelecionados) {
		this.usuarioSelecionados = usuarioSelecionados;
	}
}